package kuang.juc.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

//ConcurrentModificationException 并发修改异常
public class ListTest {
    public static void main(String[] args) {
        //并发下ArrayList不安全，synchronized可以解决，Vector就是使用synchronized解决的

        /**
         * 解决方案 synchronized可以解决
         * 1. List<String> list = new Vector<>();
         * 2. List<String> list = Collections.synchronizedList(new ArrayList<>());
         * 3. juc  List<Object> list = new CopyOnWriteArrayList<>();
         */
        //CopyOnWrite 写时复制 COW 计算机程序设计领域的一种优化策略
        //多线程调用的时候list 读取的时候固定的，写入的时候存在（覆盖）问题
        //在写入的时候避免覆盖，造成数据问题
        //比Vector快，因为Vector用的synchronized

        //List<String> list = new Vector<>();
        //List<String> list = Collections.synchronizedList(new ArrayList<>());
        List<Object> list = new CopyOnWriteArrayList<>();


        //十个线程并发添加
        for (int i = 1; i <=10 ; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}
